﻿// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "FileLibrary.generated.h"

UENUM()
enum EOperationResult
{
	Success,
	Failure,
	Exist,
	NotExist
};

UCLASS()
class MISCELLANEOUSPROJECT_API UFileLibrary : public UBlueprintFunctionLibrary
{
	GENERATED_BODY()
public:
	static EOperationResult GetOperationResult(bool InValue);
	// 判断文件夹是否存在
	UFUNCTION(BlueprintCallable)
	static bool DirectoryExists(const FString& DirectoryPath);

	// 创建文件夹，但只能创建单个文件夹，没办法创建层级文件夹
	UFUNCTION(BlueprintCallable)
	static EOperationResult DirectoryCreate(const FString& DirectoryPath, bool bOverwriteAllExisting = false);

	// 创建文件夹，可创建层级文件夹
	UFUNCTION(BlueprintCallable)
	static EOperationResult DirectoryCreateTree(const FString& DirectoryPath, bool bOverwriteAllExisting = false);

	// 删除文件夹，但只能删除单个文件夹，没办法删除层级文件夹
	UFUNCTION(BlueprintCallable)
	static EOperationResult DirectoryDelete(const FString& DirectoryPath);

	// 删除文件夹，可删除层级文件夹
	UFUNCTION(BlueprintCallable)
	static EOperationResult DirectoryDeleteRecursively(const FString& DirectoryPath);

	/** 遍历当前文件夹下的第一个层级，返回文件路径，包括文件夹和文件的路径
	 * @params DirectoryPath		文件夹路径
	 * @params IncludeDirectory		返回结果中是否包含文件夹
	 * @params IncludeFile			返回结果中是否包含文件
	 */
	UFUNCTION(BlueprintCallable)
	static TArray<FString> DirectoryIterate(const FString& DirectoryPath, bool IncludeDirectory = true, bool IncludeFile = true);

	/** 遍历当前文件夹下的所有层级，返回文件路径，包括文件夹和文件的路径
	* @params DirectoryPath			文件夹路径
	* @params IncludeDirectory		返回结果中是否包含文件夹
	* @params IncludeFile			返回结果中是否包含文件
	*/
	UFUNCTION(BlueprintCallable)
	static TArray<FString> DirectoryIterateRecursively(const FString& DirectoryPath, bool IncludeDirectory = true, bool IncludeFile = true);

	/** 复制层级文件夹包括层级文件夹下的文件也会被复制
	* @params Destination			目标文件夹路径
	* @params source				被复制的文件夹路径
	* @params bOverwriteAllExisting	是否覆盖目标文件夹路径下已存在的文件夹
	*/
	UFUNCTION(BlueprintCallable)
	static EOperationResult DirectoryCopyTree(const FString& Destination, const FString& source, bool bOverwriteAllExisting = true);

	/** 移动层级文件夹包括层级文件夹下的文件也会被复制
	* @params Destination			目标文件夹路径
	* @params source				被复制的文件夹路径
	* @params bOverwriteAllExisting	是否覆盖目标文件夹路径下已存在的文件夹
	*/
	UFUNCTION(BlueprintCallable)
    static EOperationResult DirectoryMoveTree(const FString& Destination, const FString& source, bool bOverwriteAllExisting = true);

	// 判断文件是否存在
	UFUNCTION(BlueprintCallable)
	static bool FileExist(const FString& FilePath);

	// 复制文件
	UFUNCTION(BlueprintCallable)
	static EOperationResult FileCopy(const FString& Destination, const FString& source, bool bOverwriteAllExisting = true);

	// 删除文件
	UFUNCTION(BlueprintCallable)
	static EOperationResult FileDelete(const FString& FilePath);

	// 获取文件大小，单位B
	UFUNCTION(BlueprintCallable)
    static int FileSize(const FString& FilePath);
	
	// 移动文件
	UFUNCTION(BlueprintCallable)
    static EOperationResult FileMove(const FString& Destination, const FString& source, bool bOverwriteAllExisting = true);
	
};
